
/**
 * De klasse persoon zal een aantal gegevens bewaren van een persoon.
 * 
 * @author R. Siersma
 * @date 23-11-2012
 */
public class Persoon
{
    // Burgerservicenummer van de persoon
    private int bsn;
    // Voornaam en achternaam van de persoon
    private String voornaam;
    private String achternaam;
    // Geboortedatum van de persoon gesplitst in dag, maand en jaar
    private int dag, maand, jaar;
    // Geslacht van de persoon
    private char geslacht;
    
    private Dienblad dienblad;

    /**
     * Constructor voor de klasse Persoon
     * 
     * @param   bsn         Burgerservicenummer van de persoon
     * @param   voornaam    Voornaam van de persoon
     * @param   achternaam  Achternaam van de persoon
     * @param   dag         Dag van de geboortedatum van de persoon
     * @param   maand       Maand van de geboortedatum van de persoon
     * @param   jaar        Jaar van de geboortedatum van de persoon
     * @param   geslacht    Geslacht van de persoon
     */
    public Persoon(
                    int bsn,
                    String voornaam,
                    String achternaam,
                    int dag,
                    int maand,
                    int jaar,
                    char geslacht
                   )
    {
        // Stel het bsn in met behulp van de setBsn methode
        this.setBsn(bsn);
        // Stel de voornaam in met behulp van de setVoornaam methode
        this.setVoornaam(voornaam);
        // Stel de voornaam in met behulp van de setAchternaam methode
        this.setAchternaam(achternaam);
        // Stel de geboortedatum in met behulp van de setGeboortedatum methode
        this.setGeboortedatum(dag, maand, jaar);
        // Stel het geslacht in met behulp van de setGeslacht methode
        this.setGeslacht(geslacht);
    }
    /**
     * Constructor voor de klasse Persoon
     */
    public Persoon()
    {
        // Stel de waarden in voor een onbekende geboortedatum en geslacht
        this.setGeboortedatum(0,0,0);
        this.setGeslacht('O');
    }

    /**
     * Getter voor BSN
     * @return BSN als int
     */
    public int getBsn ()
    {
        return this.bsn;
    }
    
    /**
     * Getter voor voornaam
     * @return Voornaam als string
     */
    public String getVoornaam ()
    {
        return this.voornaam;
    }
    
    /**
     * Getter voor achternaam
     * @return Achternaam als string
     */
    public String getAchternaam ()
    {
        return this.achternaam;
    }
    
    /**
    * Getter voor geboortedatum
    * @return Geboortedatum als string
    */
    public String getGeboorteDatum()
    {
        String temp;
        if (dag==0 && maand==0 && jaar==0)
        {
            temp="Onbekend";
        }
        else
        {
            temp=dag+"/"+maand+"/"+jaar;
        }
    return temp;
    }
    
    /**
     * Getter voor geslacht
     * @return Geslacht als string
     */
    public String getGeslacht ()
    {
        String temp;
        
        // Als het geslacht 'M' is return dan "Man"
        if (this.geslacht == 'M')
        {
            temp = "Man";
        }
        // Als het geslacht 'V' is return dan "Vrouw"
        else if (this.geslacht == 'V')
        {
            temp = "Vrouw";
        }
        // Het geslacht is niet 'M' of 'V', return geslacht "Onbekend"
        else
        {
            temp = "Onbekend";
        }
        
        return temp;
    }
    
    /**
     * setBsn
     * Stelt het gegeven burgerservicenummer in voor het veld bsn.
     * 
     * @param  bsn   het burgerservicenummer van de persoon
     */
    public void setBsn (int bsn)
    {
        this.bsn = bsn;
    }
    
    /**
     * setVoornaam
     * Stelt de gegeven voornaam in voor het veld voornaam.
     * 
     * @param  voornaam   de voornaam van de persoon
     */
    public void setVoornaam (String voornaam)
    {
        this.voornaam = voornaam;
    }
    
    /**
     * setAchternaam
     * Stelt de gegeven achternaam in voor het veld achternaam.
     * 
     * @param  achternaam   de achternaam van de persoon
     */
    public void setAchternaam (String achternaam)
    {
        this.achternaam = achternaam;
    }
    
    /**
     * setGeslacht
     * Stelt het gegeven geslacht in voor het veld geslacht.
     * 
     * @param  geslacht   het geslacht van de persoon (M of V, O voor onbekend)
     */
    public void setGeslacht (char geslacht)
    {
        if (Character.toUpperCase(geslacht) == 'M')
        {
            this.geslacht = 'M';
        }
        else if (Character.toUpperCase(geslacht) == 'V')
        {
            this.geslacht = 'V';
        }
        else {
            this.geslacht = 'O';
        }
    }
    
    /**
     * isSchrikkeljaar
     * Geeft aan of het jaartal (gegeven in parameter) een schrikkeljaar is of niet
     * 
     * @param jaartal Het jaartal waarvan moet worden berekend of het een schrikkeljaar is.
     * 
     * @return Als het een schrikkeljaar is 'true' anders 'false'
     */
    private boolean isSchrikkeljaar(int jaartal)
    {
        /*
         * Berekening:
         * if 
         * (
         *      jaartalDeelbaarDoor4
         *      &&
         *      (
         *          jaartalNietDeelbaarDoor100
         *          || 
         *          jaartalDeelbaarDoor400
         *      )
         * )
         * {
         *      schrikkeljaar    
         * }
         */
        if 
        (
            // Als het jaartal deelbaar is door 4 is het een schrikkeljaar
            (jaartal % 4 == 0)
            &&
            (
                // Tenzij het jaartal ook deelbaar is door 100
                (jaartal % 100 != 0)
                ||
                // Maar als het deelbaar is door 100 en door 400 is het wel een schrikkeljaar
                (jaartal % 400 == 0)
            )
        )
        {
            return true;
        }
        else {
            return false;
        }
    }
    
    /**
     * setGeboortedatum
     * Stelt de gegeven dag, maand en jaar in voor de velden dag, maand, jaar.
     * 
     * @param  dag   de geboortedag van de persoon
     * @param  maand de geboortemaand van de persoon
     * @param  jaar  het geboortejaar van de persoon
     */
    public void setGeboortedatum (int dag, int maand, int jaar)
    {
        // De maximale dagwaarde voor een bepaalde maand.
        int maxDag;
        
        // Aan de hand van de de maand wordt gekeken hoeveel dagen er in die maand zitten.
        switch (maand) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                // In deze maanden zitten er 31 dagen in een maand
                maxDag = 31;
                break;
            case 2:
                // Als het een schrikkeljaar is zitten er 29 dagen in februari
                if (this.isSchrikkeljaar(this.jaar)) 
                {
                    maxDag = 29;
                }
                // Als het geen schrikkeljaar is maar 28 dagen
                else 
                {
                    maxDag = 28;
                }
                break;
            default:
                maxDag = 30;          
        }
        
        // Controleer of alle eisen voor de datum waar zijn.
        if (
            // Dag moet 1 of hoger zijn
            dag < 1
            ||
            // Dag moet onder de maximum dag van die maand zitten
            dag > maxDag
            ||
            // Maand moet 1 of hoger zijn
            maand < 1
            ||
            // Maand mag maximaal 12 zijn
            maand > 12
            ||
            // Jaar moet 1900 of hoger zijn
            jaar <= 1900
            ||
            // Jaar moet onder 2100 zitten
            jaar >= 2100
            )
        {
            // Geboortedatum is incorrect, zet alle velden op 0.
            this.dag = 0;
            this.maand = 0;
            this.jaar = 0;
        }
        // Geboorte ddatum is correct, stel hem in
        else
        {
            this.dag = dag;
            this.maand = maand;
            this.jaar = jaar;
        }
    }
    
    /**
     * Drukt de gegevens van de persoon af naar de terminal\
     */
    public void drukAf()
    {
        System.out.println("##########");
        System.out.println("Bsn: " + this.getBsn());
        System.out.println("Voornaam: " + this.getVoornaam());
        System.out.println("Achternaam: " + this.getAchternaam());
        System.out.println("Geboortedatum: " + this.getGeboorteDatum());
        System.out.println("Geslacht: " + this.getGeslacht());
        System.out.println("##########");
    }
    
    /**
     * Methode om dienblad te koppelen aan een persoon
     * @param dienblad
     */
    public void pakDienblad(Dienblad dienblad) 
    {
        if (this.heeftDienblad())
        {
            System.out.println("U heeft al een dienblad gepakt.");
        }
        else
        {
            this.dienblad = dienblad;
        }
    }
    
    /**
     * Methode om artikel te pakken en te plaatsen op het dienblad
     * @param artikel
     */
    public void pakArtikel(Artikel artikel) 
    {
        if (this.heeftDienblad())
        {
            dienblad.voegToe(artikel);
        }
        else
        {
            System.out.println("U moet eerst een dienblad pakken voordat u een artikel kunt pakken.");
        }
    }
    
    /**
     * Methode om artikel te pakken en te plaatsen op het dienblad
     * @param artikel
     */
    public boolean heeftDienblad() 
    {
        if (this.dienblad == null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    /**
     * Methode om de totaalprijs van de artikelen 
     * op dienblad dat bij de persoon hoort uit te rekenen
     * @return De totaalprijs
     */
    public double getTotaalPrijs()
    {
        if (heeftDienblad())
        {
            return dienblad.getTotaalPrijs();
        }
        else
        {
            return 0.00;
        }
    } 

        /**
     * Methode om het aantal artikelen op dienblad dat bij de 
     * persoon hoort te tellen
     * @return Het aantal artikelen
     */
    public int getAantalArtikelen() 
    {
    	if (heeftDienblad())
        {
            return dienblad.getAantalArtikelen();
        }
        else
        {
            return 0;
        }    
    }

}

